package com.mrx.commons.utils;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Mr.X
 * @since 2024-01-11 16:00
 **/
public class StreamUtils {

    /**
     * 将 collection 使用 mapper 提供的方法转换为新的 list
     *
     * @param src    源集合, 若为 null 则会返回空的 {@link ArrayList}
     * @param mapper mapper 方法, 用以将 src 内的元素造型为 R
     * @param <T>    源类型
     * @param <R>    目标类型
     * @return 转换后的 list
     */
    public static <T, R> List<R> mapToList(Collection<T> src, Function<T, R> mapper) {
        if (src == null) {
            return new ArrayList<>();
        }
        return src.stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
    }

    /**
     * 将 collection 使用特定方法分组转换为 map
     *
     * @param src    源集合
     * @param mapper 转换方法, map 的 key
     * @param <T>    源数据类型
     * @param <R>    目标数据类型
     * @return 转换后的 map
     */
    public static <T, R> Map<R, List<T>> groupToMap(Collection<T> src, Function<T, R> mapper) {
        if (src == null) {
            return new HashMap<>();
        }
        return src.stream().filter(Objects::nonNull).collect(Collectors.groupingBy(mapper));
    }

}
